import router from './router'
import store from './store'
import { start, close } from '@/utils/nprogress';

// 白名单
const whiteList = ['/login']

router.beforeEach(async (to, from, next) => {
  start();

  // 获取localStorage中token，判断用户是否登录
  const hasToken = localStorage.getItem('token')

  if (hasToken) {
    // 当已登录时，当访问登录页时则重定向至首页
    if (to.path === '/login') {
      next('/')
    } else {
      // 判断是否获取角色信息
      const hasRoles = store.getters.roles && store.getters.roles.length > 0;
      if (hasRoles) {
        // 已获取
        next()
      } else {
        // 未获取
        try {
          // 页面刷新的时候走这里
          // 获取用户信息
          const { roles } = await store.dispatch('user/getInfo')

          // 根据用户角色过滤出可访问的路由
          const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
          // 将过滤出的页面循环添加至路由中
          accessRoutes.forEach(ele => {
            router.addRoute(ele)
          });

          let limitPage = router.getRoutes().filter(ele => ele.path == to.path);
          if (limitPage.length > 0) {
            next({ ...to, replace: true })
          } else {
            next('/404');
          }

        } catch (error) {
          // 令牌过期、网络错误等原因会导致出错，需重置令牌并重新登录
          await store.dispatch('user/resetToken')
          next(`/login?redirect=${to.path}`)
          alert(error || '未知错误')
        }
      }
    }
  } else {
    // 未登录
    if (whiteList.indexOf(to.path) !== -1) {
      // 白名单
      next()
    } else {
      // 重定向至登录页，带着当前路径方便登录成功后重定向
      next(`/login?redirect=${to.path}`)
    }
  }
})

router.afterEach(() => {
  // 关闭加载进度条
  close();
});